﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using daStaticAnalyser.Analysers;
using daStaticAnalyser;
using daBase.Analyser;
using daSyntaxAnalyser;
using daSyntaxAnalyser.SyntaxTree;

namespace DifferentAnalizers
{
    /// <summary>
    /// Анализатор - наличие публичных членов данных в классе
    /// </summary>
    [AnalyserDefaultSettings("Публичный член данных в классе.", "Наличие публичных членов данных в классе!", 50, "Для устранения ошибки перенесите член класса в закрытую (private, protected) секцию класса, а на его место поставьте свойство (property)!")]
    public class PublicMemberAnalyser : BaseStaticAnalyser
    {
        [Category("Особые")]
        [DisplayName("Показывать все")]
        [Description("Если данная опция выключена, на каждую секцию класса будет не более одного сообщения об ошибке.")]
        public bool ShowAll { get { return (settings as PublicMemberSettings).ShowAll; } set { (settings as PublicMemberSettings).ShowAll = value; } }

        /// <summary>
        /// Инициализация
        /// </summary>
        protected override void Init()
        {
            if (settings == null)
                settings = new PublicMemberSettings();
            (settings as PublicMemberSettings).ShowAll = false;
            base.Init();
        }

        /// <summary>
        /// Собственно анализ
        /// </summary>
        /// <param name="e">параметр анализа</param>
        protected override void DoAnalyse(SyntaxTreeArgs e)
        {
            if (e.Element is ClassSectionElement)
            {
                ClassSectionElement section = e.Element as ClassSectionElement;
                if ((section.Type != null) && (section.Type.Token == DelphiTokens.Public))
                    foreach (ISectionElementElement element in section.Elements)
                        if (element is VarDeclarationElement)
                        {
                            AddError(element.StartInfo, element.ToString());
                            if (!(settings as PublicMemberSettings).ShowAll) return;
                        }
            }
        }
    }
}
